cmp
cmp vleft, vright ;vleft-vright 결과값의 형태에 따라서 flag에 저장(compare insturction)
| cmp |
vleft=vright |
vleft>vright |
vleft<vright |
| ZF |
1 |
0 |
0 |
| CF |
0 |
0 |
1 |
ZF(zero flag), CF(carry flag)
Branch instruction
jmp (SHORT, NEAR, FAR)
jmp L1 ;L1으로 무조건 분기(near 이 기본형임)
short jmp ;signed 1byte로 표기(-128-127byte 이동가능) 세그먼트 내에서
near jmp ;signed 2byte로 표기(appropriciate -32,000-32,000byte 이동가능) 세그먼트 내에서
far jmp ;다른 코드세그먼트로의 분기를 허용
| JZ |
ZF가 세트 될 때 에만 분기 |
| JNZ |
ZF가 언세트 될 때 에만 분기 |
| JO |
OF가 세트 될 때 에만 분기 |
| JNO |
OF가 언세트 될 때 에만 분기 |
| JS |
SF가 세트 될 때 에만 분기 |
| JNS |
SF가 언세트 될 때 에만 분기 |
| JC |
CF가 세트 될 때 에만 분기 |
| JNC |
CF가 언세트 될 때 에만 분기 |
| JP |
PF가 세트 될 때 에만 분기 |
| JNP |
PF가 언세트 될 때 에만 분기 |
if(EAX==0){
EBX=1;
}else{
EBX=2;
}
then make source file which activate same as above C/C++ in assembly
cmp eax, 0
jz thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
mov ebx, 2
if(EAX>=5){
EBX=1;
}else{
EBX=2;
}
make it again
cmp eax, 5
js signon
jo elseblock
jmp thenblock
signon:
jo thenblock
elseblock:
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
codes be significant difficult, for this problem 80x86 give us few instruction
| SIGNED |
UNSIGNED |
| JE
vleft = vright 이면 분기 |
JE vleft = vright 이면 분기 |
| JNE
vleft != vright 이면 분기 |
JNE vleft != vright 이면 분기 |
| JL, JNGE
vleft < vright 이면 분기 |
JB, JNAE |
| JLE, JNG
vleft <= vright 이면 분기 |
JBE, JNA vleft <= vright 이면 분기 |
| JG, JNLE
vleft > vright 이면 분기 |
JA, JNBE vleft > vright 이면 분기 |
| JGE, JNL
vleft >= vright 이면 분기 |
JAE, JNB vleft >= vright 이면 분기 |
can make above assembly codes simly
cmp eax, 5
jge thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx,1
next:
Loop instruction
Loop instruction is active similar with ‘for' in C/C++
LOOP ECX의 값을 감소시키고, ECX != 0이면 라벨로 분기한다.
LOOPE, LOOPZ ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 1 이면 분기한다.
LOOPNE, LOOPNZ ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 0 이면 분기한다.
sum=0;
for(i=10;i>0;i--){
sum+=i;
}
mov eax, 0
mov ecx, 10
loop_start:
add eax, ecx
loop loop_start
loop를 cmp와 jmp를 이용해서 구현할 수 있다.